package com.twetec.cms.service.website.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.twetec.cms.common.constant.ArticleEnum;
import com.twetec.cms.common.util.validate.ValidateUtil;
import com.twetec.cms.dao.mapper.website.ArticleExtendMapper;
import com.twetec.cms.dao.mapper.website.ArticleMapper;
import com.twetec.cms.model.po.search.SearchArticlePO;
import com.twetec.cms.model.po.website.ArticlePO;
import com.twetec.cms.model.po.website.ColumnReferenceArticlePO;
import com.twetec.cms.service.website.ArticleService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 文章表 服务实现类
 * </p>
 *
 * @author zhxl
 * @since 2021-10-08
 */
@Service
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, ArticlePO> implements ArticleService {

    @Autowired
    private ArticleMapper articleMapper;

    @Autowired
    private ArticleExtendMapper articleExtendMapper;

    @Override
    public ArticlePO saveArticle(Long siteId, Long columnId, String title, String attribute, String type, String releaseChannel, String origin, String author, Date releaseTime, Date gmtAnnouncementStart, Date gmtAnnouncementEnd, String coverListJson, String coverType, String summary, Long sortArticleId, String sortType, Long userId) {

        ArticlePO articlePO = new ArticlePO();
        articlePO.setSiteId(siteId);
        articlePO.setColumnId(columnId);
        articlePO.setTitle(title);
        articlePO.setAttribute(attribute);
        articlePO.setType(type);
        // 发布渠道
        articlePO.setReleaseChannel(releaseChannel);
        // 来源
        articlePO.setOrigin(origin);
        // 作者
        articlePO.setAuthor(author);
        // 发布时间
        articlePO.setReleaseTime(releaseTime);
        // 公告开始时间
        articlePO.setGmtAnnouncementStart(gmtAnnouncementStart);
        // 公告结束时间
        articlePO.setGmtAnnouncementEnd(gmtAnnouncementEnd);
        // 封面
        if (StringUtils.isNotEmpty(coverListJson)) articlePO.setCover(coverListJson);
        // 封面类型
        articlePO.setCoverType(coverType);
        // 文章摘要
        if (StringUtils.isNotEmpty(summary)) articlePO.setSummary(summary);



        // 文章排序类型
        // 排序类型不为空的情况下有置顶、时间、自定义
        // 1、自定义
        if (ArticleEnum.SORT_TYPE_ZI_DING_YI.getValue().equals(sortType)) {
            articlePO.setSortType(sortType);
            // 一万
            articlePO.setSort(10000L);
            // 排序文章id
            if (sortArticleId != null && ValidateUtil.Number(sortArticleId)) {
                // 查询该sortArticleId为ID的文章的序号
                ArticlePO sortArticlePO = articleMapper.selectById(sortArticleId);
                if (!ValidateUtil.isNullOrEmpty(sortArticlePO)) {
                    // 1. 设置当前排序为
                    articlePO.setSort(sortArticlePO.getSort() - 1L);
                    // 2. 更新文章排序，将序号小于排序文章序号记录的序号减2
                    UpdateWrapper<ArticlePO> updateWrapper = new UpdateWrapper<ArticlePO>();
                    updateWrapper.lt("SORT", sortArticlePO.getSort());
                    updateWrapper.setSql("SORT=SORT-2");
                    articleMapper.update(new ArticlePO(), updateWrapper);
                }
            }
            // 2、置顶
        } else if (ArticleEnum.SORT_TYPE_ZHI_DING.getValue().equals(sortType)) {
            articlePO.setSortType(sortType);
            // 查询库中序号最大的，若没有找到，赋1个初始序号
            QueryWrapper<ArticlePO> articlePOQueryWrapper = new QueryWrapper<>();
            articlePOQueryWrapper.select("max(SORT) as sort");
            ArticlePO articleMapTop = articleMapper.selectOne(articlePOQueryWrapper);
            if (!ValidateUtil.isNullOrEmpty(articleMapTop)) {
                articlePO.setSort(articleMapTop.getSort() + 1L);
            } else {
                // 十万
                articlePO.setSort(100000L);
            }
        }
        // 3、发布时间或空
        else if (ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue().equals(sortType) || StringUtils.isEmpty(sortType)) {
            articlePO.setSortType(ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue());

            // 找到发布时间小于当前文章发布时间的数据
            QueryWrapper<ArticlePO> articlePOQueryWrapper = new QueryWrapper<>();
            articlePOQueryWrapper.eq("SORT_TYPE", ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue());
            articlePOQueryWrapper.le("RELEASE_TIME", releaseTime);
            articlePOQueryWrapper.select("max(SORT) as sort");
            ArticlePO articlePOTime = articleMapper.selectOne(articlePOQueryWrapper);
            // 如果找到了
            if (!ValidateUtil.isNullOrEmpty(articlePOTime)) {
                articlePO.setSort(articlePOTime.getSort() + 1L);
                UpdateWrapper<ArticlePO> updateWrapper = new UpdateWrapper<ArticlePO>();
                updateWrapper.gt("SORT", articlePOTime.getSort());
                updateWrapper.setSql("SORT=SORT+2");
                articleMapper.update(new ArticlePO(), updateWrapper);
            } else {
                // 如果没有找到,就找到比发布时间比当前文章大的中最小的
                QueryWrapper<ArticlePO> articleQueryWrapper = new QueryWrapper<>();
                articlePOQueryWrapper.eq("SORT_TYPE", ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue());
                articlePOQueryWrapper.ge("RELEASE_TIME", releaseTime);
                articlePOQueryWrapper.select("min(SORT) as sort");
//                articlePOQueryWrapper.orderByDesc("SORT");
                ArticlePO articlePOMin = articleMapper.selectOne(articlePOQueryWrapper);
                // 如果找到最小的，就赋值
                if (!ValidateUtil.isNullOrEmpty(articlePOMin)) {
                    articlePO.setSort(articlePOMin.getSort() - 1L);
                } else {
                    // 设置一个默认值
                    articlePO.setSort(50000L);
                }
            }
        }

        // 文章状态
        articlePO.setArticleStatus(ArticleEnum.STATUS_CAO_GAO.getValue());

        articlePO.setCreatorId(userId);
        articlePO.setModifierId(userId);
        int insert = articleMapper.insert(articlePO);
        if (insert > 0) return articlePO;
        return null;
    }

    @Override
    public Long mergeArticle(String articleStatus, String articleMergeStatus, Long siteId, Long columnId, String title, String attribute, String type, String releaseChannel, String origin, String author, Date releaseTime, Date gmtAnnouncementStart, Date gmtAnnouncementEnd, String coverListJson, String coverType, String summary, Long sortArticleId, String sortType, Long userId) {
        ArticlePO articlePO = new ArticlePO();
        articlePO.setSiteId(siteId);
        articlePO.setColumnId(columnId);
        articlePO.setTitle(title);
        articlePO.setAttribute(attribute);
        articlePO.setType(type);
        // 发布渠道
        articlePO.setReleaseChannel(releaseChannel);
        // 来源
        articlePO.setOrigin(origin);
        // 作者
        articlePO.setAuthor(author);
        // 发布时间
        articlePO.setReleaseTime(releaseTime);
        // 公告开始时间
        articlePO.setGmtAnnouncementStart(gmtAnnouncementStart);
        // 公告结束时间
        articlePO.setGmtAnnouncementEnd(gmtAnnouncementEnd);
        // 封面
        if (StringUtils.isNotEmpty(coverListJson)) articlePO.setCover(coverListJson);
        // 封面类型
        articlePO.setCoverType(coverType);
        // 文章摘要
        if (StringUtils.isNotEmpty(summary)) articlePO.setSummary(summary);



        // 文章排序类型
        // 排序类型不为空的情况下有置顶、时间、自定义
        // 1、自定义
        if (ArticleEnum.SORT_TYPE_ZI_DING_YI.getValue().equals(sortType)) {
            articlePO.setSortType(sortType);
            // 一万
            articlePO.setSort(10000L);
            // 排序文章id
            if (sortArticleId != null && ValidateUtil.Number(sortArticleId)) {
                // 查询该sortArticleId为ID的文章的序号
                ArticlePO sortArticlePO = articleMapper.selectById(sortArticleId);
                if (!ValidateUtil.isNullOrEmpty(sortArticlePO)) {
                    // 1. 设置当前排序为
                    articlePO.setSort(sortArticlePO.getSort() - 1L);
                    // 2. 更新文章排序，将序号小于排序文章序号记录的序号减2
                    UpdateWrapper<ArticlePO> updateWrapper = new UpdateWrapper<ArticlePO>();
                    updateWrapper.lt("SORT", sortArticlePO.getSort());
                    updateWrapper.setSql("SORT=SORT-2");
                    articleMapper.update(new ArticlePO(), updateWrapper);
                }
            }
            // 2、置顶
        } else if (ArticleEnum.SORT_TYPE_ZHI_DING.getValue().equals(sortType)) {
            articlePO.setSortType(sortType);
            // 查询库中序号最大的，若没有找到，赋1个初始序号
            QueryWrapper<ArticlePO> articlePOQueryWrapper = new QueryWrapper<>();
            articlePOQueryWrapper.select("max(SORT) as sort");
            ArticlePO articleMapTop = articleMapper.selectOne(articlePOQueryWrapper);
            if (!ValidateUtil.isNullOrEmpty(articleMapTop)) {
                articlePO.setSort(articleMapTop.getSort() + 1L);
            } else {
                // 十万
                articlePO.setSort(100000L);
            }
        }
        // 3、发布时间或空
        else if (ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue().equals(sortType) || StringUtils.isEmpty(sortType)) {
            articlePO.setSortType(ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue());

            // 找到发布时间小于当前文章发布时间的数据
            QueryWrapper<ArticlePO> articlePOQueryWrapper = new QueryWrapper<>();
            articlePOQueryWrapper.eq("SORT_TYPE", ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue());
            articlePOQueryWrapper.le("RELEASE_TIME", releaseTime);
            articlePOQueryWrapper.select("max(SORT) as sort");
            ArticlePO articlePOTime = articleMapper.selectOne(articlePOQueryWrapper);
            // 如果找到了
            if (!ValidateUtil.isNullOrEmpty(articlePOTime)) {
                articlePO.setSort(articlePOTime.getSort() + 1L);
                UpdateWrapper<ArticlePO> updateWrapper = new UpdateWrapper<ArticlePO>();
                updateWrapper.gt("SORT", articlePOTime.getSort());
                updateWrapper.setSql("SORT=SORT+2");
                articleMapper.update(new ArticlePO(), updateWrapper);
            } else {
                // 如果没有找到,就找到比发布时间比当前文章大的中最小的
                QueryWrapper<ArticlePO> articleQueryWrapper = new QueryWrapper<>();
                articlePOQueryWrapper.eq("SORT_TYPE", ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue());
                articlePOQueryWrapper.ge("RELEASE_TIME", releaseTime);
                articlePOQueryWrapper.select("min(SORT) as sort");
//                articlePOQueryWrapper.orderByDesc("SORT");
                ArticlePO articlePOMin = articleMapper.selectOne(articlePOQueryWrapper);
                // 如果找到最小的，就赋值
                if (!ValidateUtil.isNullOrEmpty(articlePOMin)) {
                    articlePO.setSort(articlePOMin.getSort() - 1L);
                } else {
                    // 设置一个默认值
                    articlePO.setSort(50000L);
                }
            }
        }

        // 文章状态
        articlePO.setArticleStatus(ArticleEnum.STATUS_CAO_GAO.getValue());

        articlePO.setCreatorId(userId);
        articlePO.setModifierId(userId);
        if (ArticleEnum.STATUS_CAO_GAO.getValue().equals(articleMergeStatus)) {
            articlePO.setArticleStatus(articleMergeStatus);
        } else if (ArticleEnum.STATUS_YI_FA_BU.getValue().equals(articleMergeStatus)) {
            articlePO.setArticleStatus(articleMergeStatus);
        } else {
            articlePO.setArticleStatus(articleStatus);
        }
        int insert = articleMapper.insert(articlePO);
        if (insert > 0) return articlePO.getId();
        return null;
    }

    @Override
    public Long updateArticle(Long id, String title, String attribute, String type, String releaseChannel, String origin, String author, Date releaseTime, Date gmtAnnouncementStart, Date gmtAnnouncementEnd, String coverListJson, String coverType, String summary, Long sortArticleId, String sortType, Long userId) {

        ArticlePO articlePO = new ArticlePO();
        // 设置id
        articlePO.setId(id);
        articlePO.setTitle(title);
        articlePO.setAttribute(attribute);
        articlePO.setType(type);
        // 发布渠道
        articlePO.setReleaseChannel(releaseChannel);
        // 来源
        articlePO.setOrigin(origin);
        // 作者
        articlePO.setAuthor(author);
        // 发布时间
        articlePO.setReleaseTime(releaseTime);
        // 公告开始时间
        articlePO.setGmtAnnouncementStart(gmtAnnouncementStart);
        // 公告结束时间
        articlePO.setGmtAnnouncementEnd(gmtAnnouncementEnd);
        // 封面
        articlePO.setCover(coverListJson);
        // 封面类型
        articlePO.setCoverType(coverType);
        // 文章摘要
        articlePO.setSummary(summary);


        // 文章排序类型
        // 排序类型不为空的情况下有置顶、时间、自定义
        // 1、自定义
        if (ArticleEnum.SORT_TYPE_ZI_DING_YI.getValue().equals(sortType)) {
            articlePO.setSortType(sortType);
            // 一万
            articlePO.setSort(10000L);
            // 排序文章id
            if (sortArticleId != null && ValidateUtil.Number(sortArticleId)) {
                // 查询该sortArticleId为ID的文章的序号
                ArticlePO sortArticlePO = articleMapper.selectById(sortArticleId);
                if (!ValidateUtil.isNullOrEmpty(sortArticlePO)) {
                    // 1. 设置当前排序为
                    articlePO.setSort(sortArticlePO.getSort() - 1L);
                    // 2. 更新文章排序，将序号小于排序文章序号记录的序号减2
                    UpdateWrapper<ArticlePO> updateWrapper = new UpdateWrapper<ArticlePO>();
                    updateWrapper.lt("SORT", sortArticlePO.getSort());
                    updateWrapper.setSql("SORT=SORT-2");
                    articleMapper.update(new ArticlePO(), updateWrapper);
                }
            }
            // 2、置顶
        } else if (ArticleEnum.SORT_TYPE_ZHI_DING.getValue().equals(sortType)) {
            articlePO.setSortType(sortType);
            // 查询库中序号最大的，若没有找到，赋1个初始序号
            QueryWrapper<ArticlePO> articlePOQueryWrapper = new QueryWrapper<>();
            articlePOQueryWrapper.select("max(SORT) as sort");
            ArticlePO articleMapTop = articleMapper.selectOne(articlePOQueryWrapper);
            if (!ValidateUtil.isNullOrEmpty(articleMapTop)) {
                articlePO.setSort(articleMapTop.getSort() + 1L);
            } else {
                // 十万
                articlePO.setSort(100000L);
            }
        }
        // 3、发布时间或空
        else if (ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue().equals(sortType) || StringUtils.isEmpty(sortType)) {
            articlePO.setSortType(ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue());
            // 找到按时间排序的最新一条数据
            QueryWrapper<ArticlePO> articlePOQueryWrapper = new QueryWrapper<>();
            articlePOQueryWrapper.eq("SORT_TYPE", ArticleEnum.SORT_TYPE_FA_BU_SHI_JIAN.getValue());
            articlePOQueryWrapper.lt("RELEASE_TIME", releaseTime);
            articlePOQueryWrapper.select("max(SORT) as sort");
            articlePOQueryWrapper.orderByDesc("RELEASE_TIME");
            ArticlePO articlePOTime = articleMapper.selectOne(articlePOQueryWrapper);
            if (!ValidateUtil.isNullOrEmpty(articlePOTime)) {
                articlePO.setSort(articlePOTime.getSort() + 1L);
                UpdateWrapper<ArticlePO> updateWrapper = new UpdateWrapper<ArticlePO>();
                updateWrapper.gt("SORT", articlePOTime.getSort());
                updateWrapper.setSql("SORT=SORT+2");
                articleMapper.update(new ArticlePO(), updateWrapper);
            } else {
                // 如果没有按时间排序的第一条数据，设置值为5万
                articlePO.setSort(50000L);
            }
        }

        articlePO.setModifierId(userId);
        int insert = articleMapper.updateById(articlePO);
        if (insert > 0) return articlePO.getId();
        return null;
    }

    @Override
    public Page<ArticlePO> getReferenceArticle(Page<ArticlePO> page, QueryWrapper<ArticlePO> queryWrapper) {
        return articleMapper.getReferenceArticle(page, queryWrapper);
    }

    @Override
    public boolean replace(ArrayList<String> articleIdList, String originContent, String replaceContent) {
        UpdateWrapper<ArticlePO> articlePOUpdateWrapper = new UpdateWrapper<>();
        articlePOUpdateWrapper.in("ID", articleIdList);
        articlePOUpdateWrapper.setSql("TITLE = REPLACE(TITLE, '" + originContent + "','" + replaceContent + "')");
        return this.update(articlePOUpdateWrapper);
    }
}
